package com.bangdao.juc;

/**
 * @author chen
 * @create 2021-01-02
 */

/**
 * lambda注意事项
 * 接口中只能有一个抽象方法的时候可以使用lambda式
 * 为了防止其余人在函数式接口中添加抽象方法，添加@FunctionalInterface注解强制约束该接口
 *
 * @FunctionalInterface添加函数式接口 函数式接口中可以有两类其他方法:
 * 1.default方法
 * 2.static方法
 */
@FunctionalInterface
interface Foo {
    int add(int a, int b);

    //1.default方法
    default int mul(int a, int b) {
        return a * b;
    }

    //2.static方法
    static int sub(int a, int b) {
        return a - b;
    }
}

public class LambdaDemo {
    public static void main(String[] args) {
        //传统方式 匿名内部类
        Foo foo = new Foo() {
            @Override
            public int add(int a, int b) {
                return a + b;
            }
        };
        System.out.println(foo.add(10, 20));
        //lambda 口诀：拷贝小括号，写死右箭头，落地大括号;
        Foo fo = (a, b) -> a + b;
        System.out.println(fo.add(10, 20));
        //static方法需要用类来调用
        System.out.println(Foo.sub(10, 20));
        System.out.println(fo.mul(10, 20));
    }
}
